#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：api_testing 
@File    ：files_handle.py
@IDE     ：PyCharm 
@Author  ：future76
@Date    ：2024/6/24 17:28 
@Desc    ：
"""
# 标准库导入
import os
import shutil
import time

from common.path_config import ENV


def get_files(target):
    """
    获取目录下所有的文件，以列表的形式返回
    @param: target: 目标文件绝对路径
    """
    if os.path.isfile(target):
        return []
    # files返回经过处理的文件列表
    files = []
    # dirpath：表示获取的目录的路径，以string形式返回值。
    for dirpath, dirnames, filenames in os.walk(target):
        for filename in filenames:
            file_path = os.path.abspath(os.path.join(dirpath, filename))
            files.append(file_path)
    return files


def copy_file(src_file_path, dest_dir_path):
    """
    复制一个文件到另一个目录
    :param: src_file_path: 源文件路径
    :param: dest_dir_path: 目标文件夹路径
    """
    # 判断源文件路径是否存在
    if not os.path.isfile(src_file_path):
        return "源文件路径不存在"

    # 判断目标文件夹路径是否存在，不存在则创建
    if not os.path.isdir(dest_dir_path):
        os.makedirs(dest_dir_path)

    # 复制文件
    try:
        shutil.copy(src_file_path, dest_dir_path)
        return "复制成功"
    except Exception as e:
        return f"复制失败：{e}"


def get_project_path(specific_file='README.md'):
    """
        获取项目根目录的绝对路径
    :param specific_file: 项目根目录下的特定文件，默认设置成README.md
    :return: 项目根目录的绝对路径
    """
    current_path = os.path.abspath(__file__)  # 获取当前文件的绝对路径
    project_root = current_path
    t1 = time.time()  # 避免搜索超时或者根目录下的特定文件不存在时的死循环
    while not os.path.exists(os.path.join(project_root, specific_file)):
        project_root = os.path.dirname(project_root)
        t2 = time.time()
        t3 = t2 - t1
        if t3 >= 60:
            raise TimeoutError(f"搜索超时，已搜索{t3:.2f}s")

    return project_root


def get_file_path(filename=None, folder_name=None, start_directory=None, one=True):
    """
    搜索并获取文件/文件夹的绝对路径
    :param filename: 需要获取的文件名字,带后缀
    :param folder_name：文件夹名
    :param start_directory: 在哪个目录下搜索的路径，默认是项目的根目录。指定目录，如果是根目录下直接填文件夹名，往下需要带路径
    :param one: 获取搜索到的第一个（默认），False就是获取到全部
    :return:  如果 one=True，返回找到的第一个文件/文件夹的绝对路径；如果 one=False，返回所有找到的文件/文件夹的绝对路径列表
    """
    # 如果带路径传入就直接返回
    if os.path.isabs(filename):
        return filename
    if start_directory is None:
        start_directory = get_project_path()
    # else:
    #     start_directory = os.path.join(get_project_path(), start_directory)
    # 初始化一个空列表来存储找到的文件的绝对路径
    all_absolute_paths = []
    # 使用os.walk遍历目录
    for root, dirs, files in os.walk(start_directory):
        # 搜索文件
        if filename and filename in files:

            absolute_path = os.path.join(root, filename)
            # 将绝对路径添加到列表中
            all_absolute_paths.append(absolute_path)
            if one:
                return absolute_path
        # 搜索文件夹
        if folder_name in dirs and folder_name:
            absolute_path=os.path.join(root, folder_name)
            if one:
                return absolute_path
            all_absolute_paths.append(absolute_path)

    return all_absolute_paths


def get_file_name(file_path):
    """
    获取文件名与扩展名
    :param file_path: 文件绝对路径
    :return: 文件名与扩展名
    """
    # 使用os.path.basename获取文件名与扩展名
    file_name_with_extension = os.path.basename(file_path)
    # 使用os.path.splitext分离文件名和扩展名
    file_name, file_extension = os.path.splitext(file_name_with_extension)
    # 去除扩展名前的点号
    file_extension = file_extension.lstrip('.')
    return file_name, file_extension


def get_file_names_in_directory(directory_path):
    """
    获取指定文件夹下的所有文件名和扩展名
    :param directory_path: 文件夹路径
    :return: 文件名和扩展名的列表（元组形式）
    """
    file_names_and_extensions = []  # 初始化一个空列表来存储文件名和扩展名

    # 遍历指定目录下的所有文件和文件夹
    for filename in os.listdir(directory_path):
        # 构造完整的文件路径
        full_path = os.path.join(directory_path, filename)

        # 检查是否是一个文件
        if os.path.isfile(full_path):
            # 获取文件名和扩展名
            file_name, file_extension = os.path.splitext(filename)

            # 去除扩展名前的点号
            file_extension = file_extension.lstrip('.')

            # 将文件名和扩展名作为元组添加到列表中
            file_names_and_extensions.append((file_name, file_extension))

            # 返回文件名和扩展名的列表
    return file_names_and_extensions


def case_file(env, dir_path):
    """
    给定环境匹配的文件名列表

    :param env: 配置的环境
    :param dir_path: 指定文件夹路径
    :return: 返回符合的文件列表
    """
    # 检查文件夹是否存在
    if not os.path.isdir(dir_path):
        raise ValueError(f"文件夹 {dir_path} 不存在.")

    # 列出文件夹中的所有文件
    all_files = os.listdir(dir_path)

    # 如果env为空，返回所有文件
    if not env:
        return all_files

    # 筛选出以env结尾的文件
    case_files = [
        filename for filename in all_files
        if filename.endswith(f"_{env}.xlsx")
    ]

    return case_files


if __name__ == '__main__':

    print(case_file(ENV,"../../data"))


